home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / dev / asm / Asm_Course2.lha / Teil22.TXT < prev    next >
Text File  |  1992-09-02  |  11KB  |  226 lines

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990
  2.  
  3.                                 22.Teil...
  4.  
  5. Hei, Leuts...lange hats gedauert...jetzt bin ich wieder da. Hatte die Woche
  6. unheimlich viel zu tun, aber jetzt geht es weiter.
  7.  
  8. Ich hab mir ueberlegt was man noch zum Thema Intro`s machen koennte.
  9. Bis jetzt haben wir grosse Routinen, tolle Effekte usw. kennengelernt.
  10.  
  11. Ich muss jetzt aufpassen was ich sage, nicht das ihr denkt ich wuerde das
  12. machen, aber beschaeftigt habe ich mich natuerlich schon damit.
  13.  
  14. `Stellt euch vor ihr habt ein Spiel gecrackt (Gott bewahre), und es belegt
  15. auf Diskette 98%. Dann bleiben fuer das Intro, das natuerlich noch drauf
  16. muss nicht mehr als 16 Kilobyte. Aber drauf muss es das ist doch Ehrensache.`
  17.  
  18. Naja wie kriege ich da noch ein Intro drauf ?...
  19.  
  20. Ganz einfach: Ich verrate euch sicher kein grosses geheimnis wenn ich euch
  21. sage das man den Bootblock auch mit eigenen Programmen vollstopfen kann.
  22. Deshalb werde ich hier sofort zeigen wie man es macht, ohne das ich es auf
  23. die geheimnisvolle Tour mancher Buecher beschreibe.
  24. Wie gesagt kann ich allesmoegliche in de Bootblock setzen.
  25. Es darf allerdings nicht groesser als 1 Kilobyte = 1024 Byte sein.
  26. Davon ab geht allerdings der Boot Header, der Die DOS Kennung, die
  27. Checksumme des Bootblocks, und die Adresse des Rootblocks enthaelt.
  28.  
  29. Jetzt kann man sein Programm reinschreiben, und wenn man sich mit dem
  30. Trackdisk-Device auskennt, kann man den Rest von Ihm erledigen lassen.
  31. Falls aber nicht, muss man noch eine kleine Routine hinter unser Intro
  32. Pflanzen, die dann den Boot vorgang weiter fuehrt.
  33.  
  34. Wenn wir davon ausgehen das wir nicht mit dem Trackdisk Device arbeiten,
  35. sondern die Diskette nach dem Intro ganz einfach weiterdurchlaufen lassen,
  36. so mit Startup-Sequence und dem Ganzen Zeug. Dann belegt die Kennung und
  37. das noetige Programm genau 54 ($36) Bytes. Bleiben uns also `970` Bytes
  38. fuer uns...Da kriegt man schon was mit hin... Also rein in den Bootblock.
  39.  
  40. Erstmal muesst ihr aber ein Paar sachen ueber den Bootblock wissen.
  41.  
  42. Das Programm was sich auf dem Bootblock befindet, wird vom Betriebssystem
  43. praktisch als kleines unterprogramm ausfuehrt, deshalb muessen wir bevor
  44. wir den Prozessor in Anspruch nehmen, alle Register retten. Wie wir das
  45. machen kennt ihr ja schon...kommt aber Spaeter.
  46.  
  47. Das Betriebssystem geht nach einem Reset ein paar Tests durch und verzweigt
  48. dann in die Bootroutine. Diese holt sich dann den Bootblock in den
  49. Speicher, und prueft die die DOS-Markierung am Anfang. Ist die nicht
  50. vorhanden, so wird die Meldung `No DOS Disk` ausgegeben. Ist die aber in
  51. Ordnung, so prueft das Betriebssystem noch die Checksumme des Bootblocks.
  52. Die ist noetig damit klar ist das das programm auf dem bootblock auch O.K
  53. ist. Ist diese Checksumme nicht In Ordnung, dann stellt sich das
  54. Betriebssystem dumm und wartet weiter auf eine Diskette. Andernfalls wird
  55. das Programm, egal was es macht ausgefuehrt....Das ist der Punkt warum
  56. Viren oft in Bootbloecken liegen, sie werden dort sofort gestartet, sobald
  57. die DOS kennung und die Checksumme (Pruefsumme, auf Deutsch) In ordnung
  58. ist.
  59.  
  60. Wenn man jetzt denkt das sich die Herren Programmierer eine besonders
  61. Heimtueckische Berechnung der Checksumme ausgedacht haben, weil man halt
  62. doch auch sehr viel unfug damit treiben kann, dann denkt man falsch.
  63.  
  64. `Die Pruefsumme berechnet man wie folgt`
  65.  
  66. Alle 256 Langwoerter die der Bootblock hat werden addiert, und was dann
  67. noch zur 0 fehlt, also 0 - (Summe der langwoerteraddition) ist die
  68. Pruefsumme.
  69. Beispiel: Haben wir alle Langwoerter addiert, ung kommen auf das Ergebnis
  70.  
  71.         $3ef6547a
  72.  
  73. Dann ziehen wir das nur von Null ab..
  74.  
  75.         $00000000 - $3ef6547a = $c109ab86
  76.  
  77. So einfach bekommt man die Checksumme. Kein Besonderer Schutz, wenn man
  78. ueberlegt was sich eben diese leute ausgedacht haben um an die Pruefsumme
  79. des Kickstarts zu kommen. Naja die Grundlagen habt ihr jetzt, dann will ich
  80. mal das Orginal Bootblock listing des Install-Befehls rausruecken..
  81.  
  82.  
  83. Kennung:   dc.b "DOS",0         ; Dos-kennung, endet mit 0
  84. Chksum:    dc.l $00000000       ; Platz fuer die Checksumme
  85. Rootblock: dc.l $00000370       ; Adresse des Rootblocks
  86.  
  87. Bootprg:
  88.         Lea     Resname(PC),a1  ; Zeiger auf Dos.library
  89.         Jsr     -96(a6)         ; Resident Routine von Exec
  90.         Tst.l   d0              ; Auf Fehler testen
  91.         Beq.s   Error           ; Falls fehler Error Routine anspringen
  92.         Move.l  d0,a0           ; Falls nicht Adresse als Zeiger nach A0
  93.         Move.l  22(a0),a0       ; Langwort das an 22. Stelle steht nach A0
  94.         Moveq   #$00,d0         ; Kein fehler !
  95. Ende:
  96.         Rts                     ; Raus
  97. Error:
  98.         Move.l  #$ff,d0         ; Fehlercode nach d0
  99.         Bra.s   Ende            ; Raus
  100.  
  101. Resname:   dc.b "dos.library",0
  102.  
  103. Die .S bei dem Beq und dem Bra-Befehl habe ich dran gehaengt..ist dann
  104. etwas kuerzer !
  105. Achja noch ein paar sachen zum Dos und so. Wenn ein Programm ins CLI
  106. zurueckkehrt dann wird in D0 der Status mitgeschickt. 0 wenn alles in
  107. Ordnung ist, und etwas anderes wenn was falsch gelaufen ist. Bei unseren
  108. Programmen muessen wir das natuerlich von Hand machen. Hab ich auch immer,
  109. schaut euch die Listings mal an, dort steht vor dem RTS immer das
  110. Moveq #0,d0 welches dem CLI sagt `Kein Fehler`.
  111.  
  112. Desweiteren hab ich ja schon Erzaehlt das die Exec-Library immer offen ist,
  113. und man nur noch den zeiger aus $00000004 lesen muss um damit zu arbeiten.
  114. Ihr werdet euch also wundern wie ich eine Routine von Exec benutzen kann,
  115. wenn ich das nicht Initialisiert habe. Das ist auch einfach. Der Grund warum
  116. ich die meisten register Retten muss war doch das in ihnen wichtige Daten
  117. und Adressen sind. Nun zwei davon sind sehr wichtig. In A6 steht der Zeiger
  118. auf Exec, und in A1 steht der zeiger auf das Trackdisk-Device. Was wir mit
  119. dem Trackdisk-Device anstellen koennen, kommt spaeter.
  120.  
  121. Da das Prograemchen gut Erklaert ist, muesste man eigentlich keine
  122. Probleme haben es nachzuvollziehen. falls nicht ist es auch nicht so
  123. schlimm, denn das einzige was wir mit dieser Routine machen ist sie immer
  124. wieder ein unsere Bootblock Intro`s zu setzen....mehr nicht !
  125.  
  126. So, jetzt wollen wir mal den Bootblock irgendeiner Disk von Hand
  127. `Installieren`. Naja, was heisst von Hand, wir bedienen uns eines
  128. programmes das man im allgemeinen Monitor nennt. Das das nicht das Ding ist
  129. auf das ihr oefters mal schaut ist klar. Ich benutzen den Amon, den Ihr im
  130. Tools oder Do-Ami Brett findet. ich setze euch die neuste Version rein.
  131.  
  132. Als erstes muessen wir aber mal den Bootblock erzeugen.
  133. Dazu setzen wir vor das eigentliche Listing die Org/Load Kombination, und
  134. lassen uns das teil nach $40000 schreiben.
  135.  
  136. Bevor wir das Ding assemblieren, muessen wir den Bereich den wir
  137. abspeichern noch Saeubern, damit wir keinen Muell im Bootblock haben. Das
  138. machen wir mit dem Fill kommando des Seka.
  139. Wir muessen 1 KiloByte loeschen, also von $40000 bis $40400.
  140.  
  141. Dann assemblieren wir den Krempel, starten ihn aber nicht (haette auch
  142. nicht viel Sinn). Jetzt kommt das WI kommando, das den Speicherauszug in
  143. dem der Bootblock steht auf Diskette speichert..Wir nennen es mal einfach
  144. Bootblock (Sprich: BuhtBlock). Jetzt verlassen wir den Seka, und laden den
  145. Amon...Hier erstmal eine Befehlsuebersicht der wichtigsten kommandos mit
  146. kleinen Kommentaren..
  147.  
  148. ?                       Help Seite, alle Kommandos mit benoetigten
  149.                         Parametern und Syntax
  150. x                       Exit, Raus, Fin, Sense, Schluss...usw.
  151. dir                     Gibt die Aktuelle Directory aus
  152. cd Drive                Wechselt das Verzeichnis oder die Disk
  153. cls                     Loescht den Bildschirm
  154. r                       Zeigt alle register an
  155. a  Addr                 Schaltet einen Assembler an ab Adresse Addr
  156. d  Addr1 Addr2          Diassembliert den Bereich von Addr1 bis Addr2
  157. m  Addr1 Addr2          Zeigt den Bereich von Addr1 bis Addr2, Addr2 kann
  158.                         weggelassen werden
  159. :  Addr  Bytes          Zum veraendern von `Bytes` Bytes ab Adresse Addr
  160. f  Addr1 Addr2 Bytes    Fuellt den Speicher von Addr1 bis Addr2 mit Bytes
  161. [  Addr  Name           Laedt File nach Addr von Aktueller Disk
  162. ]  Addr  Lenght Name    Schreibt File ab Addr auf Aktuelle Disk
  163. <  Addr  Drive  Block  Cnt      Laedt von Laufwerk Drive ab Block, soviel
  164.                                 Blocks wie in Cnt angegeben
  165. >  Addr  Drive  Block  Cnt      Schreibt Blocks nach demselben Schema wie
  166.                                 gelesen wird
  167. del name                Loescht Programm auf der Aktuellen Disk
  168. =  Addr                 Diskblock Checksumme
  169. #  Addr                 Bootblock Checksumme
  170. g  Addr                 Programm ab Addr ausfuehren
  171. c  Addr1 Addr2 Dest     Vergleicht den bereich Dest mit dem bereich Addr1
  172.                         bis Addr2
  173. t  Addr1 Addr2 Dest     Copiert bereich von Addr1 bis Addr2 nach Dest
  174. h  Addr1 Addr2 Bytes    Sucht von Addr1 bis Addr2 nach bytes
  175. n  num                  rechnet zahlen in die verschiedenen Systeme um.
  176.  
  177. Also, da ihr jetzt die wichtigsten Befehle des Amon kennt koennen wir ja
  178. weiter machen.
  179. Ihr habt jetzt das Image des Bootblocks auf als normales File auf Diskette.
  180. Jetzt den Amon laden und mit cd drive, auf die Diskette gehen wo das Image
  181. drauf ist. Da der Bootblock noch ein normales File ist, muessen wir ihn
  182. auch normales File einladen. Das geschieht mit [ - und die Adresse wo wir
  183. es hinhaben wollen dahinter, wir sollten uns die merken, sie ist fuer das
  184. weitere arbeiten wichtig. Also gehen wir mal davon aus das wir das
  185. Bootblock Image nach $40000 geladen haben. Der Amon gibt aus von wo bis wo
  186. das Zeug liegt.
  187. Das was ich bis jetzt gemacht habe koennten wir aber auch mit dem Seka
  188. machen, ohne dabei ins Schwitzen zu geraten. Allerdings kommen jetzt die
  189. Sachen die den Amon so wertvoll fuer uns machen.
  190.  
  191. Vielleicht ist euch die Funktion # Bootblock Checksumme schon aufgefallen.
  192. Ist atuerlich super das man das mit dem Amon machen kann. Besser ist
  193. allerdings noch das er sie auch gleichzeitig in die richtige Adresse
  194. schreibt. Bei dem Aufruf `# 40000` rechnet er die Checksumme aus und setzt
  195. sie an den dafuer reservierten Platz. Der Bootblock steht jetzt also
  196. lauffaehig im Speicher. Das problem ist jetzt nur noch wie wir ihn auf die
  197. Disk kriegen.
  198.  
  199. Der Bootblock ist kein File, eigentlich sind es auch 2 Bloecke. Er wird
  200. einfach in Block 0 und 1 auf die Disk geschrieben. Das koennen wir mit dem
  201. Amon auch, naemlich mit > 40000 1 0 2. Wobei die werte klar sind
  202.  
  203. 40000   Adresse ab der die Daten im Speicher liegen
  204. 1       Drive Df1:
  205. 0       Bei Block null beginnen
  206. 2       Insgesamt zwei Blocks schreiben
  207.  
  208. Sobald ihr das gemacht habt, koennt ihr die Diskette aus dem Drive Df1:
  209. entnehmen und in Df0: schieben. Nach Reset muesste der Amiga normal Booten.
  210. Es muss keine Lauffaehige Diskette sein um zu sehen das es tut. Sobald die
  211. anseren Laufwerke anfangen zu initialisieren oder spaetestens wenn das
  212. Amiga-Dos fenster steht wisst ihr das es geklappt hat.
  213.  
  214. Ihr koennt euch ja schonmal was fuer euer Bootintro ueberlegen. Die
  215. Programmierung des Bootblocks unterscheidet sich nur in zwei Punkten von der
  216. der normalen Intros.
  217.  
  218. 1. Alles sollte moeglichst kurz gehalten werden.
  219. 2. Adressen im Programm sollten immer PC-Relativ ermittelt werden.
  220.  
  221. Dazu aber im naechsten Teil mehr.
  222.  
  223. Ciao
  224.  
  225.                 Jeff Kandle
  226.